home *** CD-ROM | disk | FTP | other *** search
- /*________________________________________________________
-
- File: Spooling.c
-
- This is the C source for a printing extension
- that redirects spool files.
-
- Dave Hersey
- Apple Developer Technical Support
-
- 1/29/93 - dmh - Begat.
- 4/26/93 - dmh - Updated for b1.
- - Switched to using the recommended
- approach for initializing global data.
- 9/06/93 - dmh - Updated for b2.
- - Switched to Exception.h assertion stuff
- for error checking.
- 12/18/93 - dmh - Updated for b3.
- 3/22/94 - dmh - Updated for b4.
- 6/14/96 - cn - Updated to support Universal Interfaces 2.1.
-
- (Note: all functions are in the Mark menu)
-
- __________________________________________________________*/
-
- #include "Spooling.h"
-
- // globals:
-
- short gPrefsVRefNum; // The volume it resides on. (For FlushVol.)
- AliasHandle gCurFolderAlias; // The current folder alias used by the panel.
- Boolean gSettingsChanged; // True if we have panel changes to save.
- Boolean gLastOnOffSetting; // The "extTurnedOn" setting when we opened the panel.
-
-
- /*******************************************************************
- InitGlobalData is used to initialize any global data we need to
- in our initialize message override. It's critical that you do
- things this way, rather than access the data in the same scope
- that you call NewMessageGlobals. Otherwise, some compilers
- will give you code that references an invalid A5 world.
-
- ********************************************************************/
-
- OSErr InitGlobalData()
- {
- gCurFolderAlias = nil;
- return noErr;
- }
-
-
- /*******************************************************************
- SPInitialize is our override for GXInitialize. We set up our
- A5 world and jump off to initialize our global data.
-
- ********************************************************************/
-
- OSErr SPInitialize()
- {
- OSErr err;
-
- err = NewMessageGlobals(A5Size(), A5Init);
- if (!err) err = InitGlobalData();
-
- return err;
- }
-
-
- /*******************************************************************
- SPShutDown is our override for GXShutDown. It just frees up
- the A5 world we created in SPInitialize.
-
- ********************************************************************/
-
- OSErr SPShutDown()
- {
- DisposeMessageGlobals();
- return noErr;
- }
-
-
- /*******************************************************************
- SPJobPrintDialog is our override for GXJobPrintDialog. All we
- do is set up our panel and then forward the message.
-
- ********************************************************************/
-
- OSErr SPJobPrintDialog(gxDialogResult *dlogResult)
- {
- OSErr err;
-
- err = SetUpPrintPanel();
-
- if (!err)
- err = Forward_GXJobPrintDialog(dlogResult);
-
- return err;
- }
-
-
- /*******************************************************************
- SetUpPrintPanel sets up our print panel, adding a default
- SpoolCollection item to the job collection with our previous
- settings. This collection item has the values we'll use to
- set up our panel's controls.
-
- ********************************************************************/
-
- OSErr SetUpPrintPanel()
- {
- OSErr err;
- gxPanelSetupRecord panelSetupRec;
- SpoolCollection spoolConfig;
-
- // Try to find our collection item. We also try to get the default settings so
- // that we make sure the Prefs file is available. If it's not, a new file will
- // be created by GetDefaultSettings.
-
- err = GetDefaultSettings(&spoolConfig);
- nrequire(err, CanNotLoadDefaults);
-
-
- // Store our settings in the job collection.
-
- err = AddCollectionItem(GXGetJobCollection(GXGetJob()),
- kSpoolCollectionType,
- gxPrintingTagID,
- sizeof(SpoolCollection),
- &spoolConfig);
-
- nrequire(err, HaveCollectionMgrError);
-
-
- // Now, do the actual panel set up.
-
- gSettingsChanged = false;
- gLastOnOffSetting = spoolConfig.extTurnedOn;
-
- panelSetupRec.panelResId = r_spoolPanel; // which panel resource?
- panelSetupRec.resourceRefNum = GXGetMessageHandlerResFile(); // where is it?
- panelSetupRec.refCon = 0; // we don't use this.
- panelSetupRec.panelKind = gxExtensionPanel; // This is an extension panel.
-
- err = GXSetupDialogPanel(&panelSetupRec);
-
- HaveCollectionMgrError:
- CanNotLoadDefaults:
-
- return err;
- }
-
-
- /*******************************************************************
- SPHandlePanelEvent is our override for GXHandlePanelEvent. If
- the event is one of ours, we handle it. Otherwise, we just
- forward it down the chain.
-
- ********************************************************************/
-
- OSErr SPHandlePanelEvent(gxPanelInfoRecord *panelInfo)
- {
- OSErr err = noErr;
- GrafPtr oldPort;
- DialogPtr pDlg;
- Handle hItem;
- Rect itemRect;
- short itemType;
- short oldResFile;
- SpoolCollection spoolConfig;
- FSSpec curFSpec;
-
- pDlg = panelInfo->pDlg;
- GetPort(&oldPort);
- SetPort(pDlg);
-
- switch (panelInfo->panelEvt)
- {
-
- // If our panel is opening, go do any initialization we need to.
-
- case gxPanelOpenEvt:
- OpenSpoolPanel(pDlg, panelInfo->itemCount);
- break;
-
- // If the user hit the "Print" or "Save" buttons, go save any
- // changes we need to.
-
- case gxPanelConfirmEvt:
- err = SavePanelChanges();
- break;
-
-
- // If the user hits the "Spool to…" button, prompt them for a folder.
- // If they select one, get our old collection item, move the FSSpec info to it,
- // and replace the old collection item with our modified one.
-
- case gxPanelHitEvt:
- if (panelInfo->itemHit == (panelInfo->itemCount + d_selectDirectory))
- {
- oldResFile = CurResFile();
- UseResFile(GXGetMessageHandlerResFile());
-
- require(GetFolder(&curFSpec), GetFolder_Failed);
-
- gSettingsChanged = true;
- err = GetSpoolCollection(&spoolConfig);
- nrequire(err, GetSpoolCollection_Failed);
-
- if (gCurFolderAlias != nil)
- {
- DisposHandle((Handle) gCurFolderAlias);
- gCurFolderAlias = nil;
- }
-
- err = NewAlias(nil, &curFSpec, &gCurFolderAlias);
- nrequire(err, NewAlias_Failed);
- AliasToPathName(gCurFolderAlias, (char *) spoolConfig.folderName, (char *) spoolConfig.volumeName);
- err = AddCollectionItem(GXGetJobCollection(GXGetJob()),
- kSpoolCollectionType,
- gxPrintingTagID,
- sizeof(SpoolCollection),
- &spoolConfig);
-
- nrequire(err, AddCollectionItem_Failed);
-
- GetDItem(panelInfo->pDlg, panelInfo->itemCount +d_folderName, &itemType, &hItem, &itemRect);
- SetIText(hItem, spoolConfig.folderName);
- GetDItem(panelInfo->pDlg, panelInfo->itemCount +d_volumeName, &itemType, &hItem, &itemRect);
- SetIText(hItem, spoolConfig.volumeName);
-
-
- AddCollectionItem_Failed:
- NewAlias_Failed:
- GetSpoolCollection_Failed:
- GetFolder_Failed:
-
- UseResFile(oldResFile);
- }
- break;
- }
-
- SetPort(oldPort);
- return err;
- }
-
-
- /*******************************************************************
- OpenSpoolPanel handles non-'xdtl' item initialization when we
- open our panel. Note that our items will be offset from
- itemCount. (So, if we want item #5 in our DITL, we pass
- itemCount +5 to GetDItem.)
-
- ********************************************************************/
-
- void OpenSpoolPanel(DialogPtr pDlg, short itemCount)
- {
- SpoolCollection spoolConfig;
- Handle hItem;
- Rect itemRect;
- short itemType;
-
- // Initialize the current file name displayed, based on the
- // settings in our SpoolCollection item.
-
- GetSpoolCollection(&spoolConfig);
- GetDItem(pDlg, itemCount +d_folderName, &itemType, &hItem, &itemRect);
- SetIText(hItem, spoolConfig.folderName);
- GetDItem(pDlg, itemCount +d_volumeName, &itemType, &hItem, &itemRect);
- SetIText(hItem, spoolConfig.volumeName);
- }
-
-
- /*******************************************************************
- SavePanelChanges saves our panel settings to disk when they
- change and the user confirms our panel. We only save the
- settings if they've changed since the last save.
-
- ********************************************************************/
-
- OSErr SavePanelChanges()
- {
- OSErr err;
- SpoolCollection spoolConfig, **spoolCollHdl;
- short oldResFile, resRefNum;
-
- err = GetSpoolCollection(&spoolConfig);
- nrequire(err, GetSpoolCollection_Failed);
-
-
- // If our settings haven't changed, exit.
-
- gSettingsChanged = (gSettingsChanged || (spoolConfig.extTurnedOn != gLastOnOffSetting));
- require(gSettingsChanged, SettingsHaveNotChanged);
-
-
- // Open the preferences file and set it as our current resource file.
-
- oldResFile = CurResFile();
- err = OpenPrefsFile(&resRefNum, fsRdWrPerm);
- nrequire(err, OpenPrefsFile_Failed);
- UseResFile(resRefNum);
-
-
- // Create a handle to store our settings in, move the settings to that handle,
- // and then store it to disk as a resource. Also store the folder alias as a
- // resource. If we can do this without any errors occurring, update our
- // global flags.
-
- spoolCollHdl = (SpoolCollection**) NewHandle(sizeof(SpoolCollection));
- nrequire((err = MemError()), NewHandle_Failed);
-
- BlockMove(&spoolConfig, *spoolCollHdl, sizeof(SpoolCollection));
- err = ReplaceResource((Handle) spoolCollHdl, kConfigType, kConfigID);
- DisposHandle((Handle) spoolCollHdl);
- nrequire(err, ReplaceResource_Failed);
-
- err = ReplaceResource((Handle) gCurFolderAlias, rAliasType, kAliasID);
- nrequire(err, ReplaceResource_Failed);
- gSettingsChanged = false;
- gLastOnOffSetting = spoolConfig.extTurnedOn;
-
-
- ReplaceResource_Failed:
- NewHandle_Failed:
-
- UseResFile(oldResFile);
- CloseResFile(resRefNum);
-
-
- OpenPrefsFile_Failed:
- SettingsHaveNotChanged:
- GetSpoolCollection_Failed:
-
- return err;
- }
-
-
- /*******************************************************************
- SPCreateSpoolFile is our override for GXCreateSpoolFile. It
- just gets our collection item, sees if we're supposed to do
- anything, and if so, changes where we create the spool file
- before forwarding the message.
-
- If we get an error, we ignore it and try to create the spool
- file without redirection. This is so we're more user-friendly
- in the case of a glitch. At least their file will be created.
-
- ********************************************************************/
-
- OSErr SPCreateSpoolFile(FSSpec * anFSSpec, long createOptions, gxSpoolFile *spFile)
- {
- OSErr err;
- SpoolCollection **spoolCollHdl;
- short oldResFile, resRefNum;
- AliasHandle folderAlias;
- FSSpec theFSSpec;
- Boolean wasChanged;
-
- // Get and open our preferences file's resoruce fork.
-
- oldResFile = CurResFile();
- err = OpenPrefsFile(&resRefNum, fsRdWrPerm);
- nrequire(err, OpenPrefsFile_Failed);
- UseResFile(resRefNum);
-
-
- // Load the folder alias and extension settings we last saved.
-
- folderAlias = (AliasHandle) Get1Resource(rAliasType, kAliasID);
- nrequire((err = ResError()), CouldNotLoadAlias);
- DetachResource((Handle) folderAlias);
-
- spoolCollHdl = (SpoolCollection **) Get1Resource(kConfigType, kConfigID);
- nrequire((err = ResError()), CouldNotLoadSettings);
-
-
- // If the user had usd turned on, try to resolve the alias. If it gets updated,
- // save the new alias to disk.
-
- if ((*spoolCollHdl)->extTurnedOn)
- {
- err = ResolveAlias(nil, folderAlias, &theFSSpec, &wasChanged);
- nrequire(err, ResolveAlias_Failed);
-
- if (wasChanged)
- err = ReplaceResource((Handle) folderAlias, rAliasType, kAliasID);
-
- nrequire(err, ReplaceResource_Failed);
- FSMakeFSSpec(theFSSpec.vRefNum, GetActualDirID(&theFSSpec), anFSSpec->name, &theFSSpec);
- BlockMove(&theFSSpec, anFSSpec, sizeof(FSSpec));
- }
-
-
- // Release the settings resource, dispose of the alias handle, reset our current
- // resource file, close the prefs file, and forward the message down the chain.
-
- ReplaceResource_Failed:
- ResolveAlias_Failed:
-
- ReleaseResource((Handle) spoolCollHdl);
-
-
- CouldNotLoadSettings:
-
- DisposHandle((Handle) folderAlias);
-
-
- CouldNotLoadAlias:
-
- UseResFile(oldResFile);
- CloseResFile(resRefNum);
-
-
- OpenPrefsFile_Failed:
-
- return Forward_GXCreateSpoolFile(anFSSpec, createOptions, spFile);
- }
-
-
- /*******************************************************************
- GetFolder is a replacement for StandardGetFile which allows
- us to select directories.
-
- ********************************************************************/
-
- Boolean GetFolder(FSSpec *fSpec)
- {
- OSErr err;
- Point where = {-1,-1};
- StandardFileReply sfReply;
- short foundVRefNum;
- long foundDirID;
-
- // Have the user select a folder using the GetFile dialog.
-
- // CustomGetFile((FileFilterYDProcPtr) FilterAllFiles, -1, nil, &sfReply, r_fileDlogID,
- CustomGetFile((FileFilterYDUPP) FilterAllFiles, -1, nil, &sfReply, r_fileDlogID,
- where, (DlgHookYDUPP) MyDlgHook, nil, nil, nil, &sfReply);
-
- require(sfReply.sfGood, UserCancelledDialog);
-
-
- // If the user selected a volume, use the boot volume's desktop folder instead.
-
- nrequire(sfReply.sfIsVolume, UserDidNotChooseVolume);
-
- err = FindFolder(kOnSystemDisk, kDesktopFolderType, kCreateFolder, &foundVRefNum, &foundDirID);
- nrequire(err, FindFolder_Failed);
-
- err = FSMakeFSSpec(foundVRefNum, foundDirID, nil, fSpec);
-
-
- UserDidNotChooseVolume:
-
- err = FSMakeFSSpec(sfReply.sfFile.vRefNum, sfReply.sfFile.parID, nil, fSpec);
-
-
- // There appears to be a bug in the CustomGetFile stuff. Sometimes the directory
- // returned is bogus. It seems to only happen when the desktop folder should be
- // selected. MPW demonstrates this same bug, so I don't think it's my code.
- //
- // Test: using a system with more than one volume attached, use MPW's "Set Directory"
- // dialog to highlight the desktop icon of a drive other than the boot drive. Now
- // hit the "Select Current Directory" button. All's well. Go back and highlight a
- // folder alias that belongs to a DIFFERENT volume (or highlight nothing at all) at
- // the desktop folder level, and select that. You get an error. (-120, "directory
- // not found"). That's what I was seeing here too.
- //
- // It appears that the standard file stuff is looking for the desktop folder of the
- // wrong volume. As a work-around, I simply return the boot drive's desktop folder
- // if I get a "directory not found" error.
-
- if (err == dirNFErr)
- {
- err = FindFolder(kOnSystemDisk, kDesktopFolderType, kCreateFolder, &foundVRefNum, &foundDirID);
- nrequire(err, FindFolder_Failed);
-
- err = FSMakeFSSpec(foundVRefNum, foundDirID, nil, fSpec);
- }
-
-
- FindFolder_Failed:
-
- if (err) sfReply.sfGood = false;
-
-
- UserCancelledDialog:
-
- return sfReply.sfGood;
- }
-
-
- /*******************************************************************
- MyDlgHook is a dialog hook routine for CustomGetFile.
-
- ********************************************************************/
-
- pascal short MyDlgHook(short item, DialogPtr theDlg, Ptr userData)
- {
- StandardFileReply *curReply;
- OSType refCon;
-
- // Unless we're being called from the main SF dialog, we don't do
- // anything.
-
- refCon = GetWRefCon(theDlg);
- require((refCon == sfMainDialogRefCon), NotMainSFDialog);
-
-
- // If the user has selected the volume icon, change to the
- // desktop folder. If they've selected our "Select Current Folder"
- // button, "OK" the dialog.
-
- curReply = (StandardFileReply *) userData;
-
- switch (item)
- {
- case sfItemVolumeUser:
- curReply->sfFile.name[0] = '\0';
- curReply->sfFile.parID = 2;
- curReply->sfIsFolder = false;
- curReply->sfIsVolume = false;
- curReply->sfFlags = 0;
- item = sfHookChangeSelection;
- break;
-
- case d_selectItem:
- item = sfItemOpenButton;
- break;
- }
-
-
- NotMainSFDialog:
-
- return item;
- }
-
-
- /*******************************************************************
- FilterAllFiles is our CustomGetFile filterProc that only lets
- directories be added to the display list.
-
- ********************************************************************/
-
- pascal Boolean FilterAllFiles(CInfoPBPtr pb, Ptr myDataPtr)
- {
- #pragma unused(myDataPtr);
-
- return (Boolean) !(pb->hFileInfo.ioFlAttrib & (1 <<4));
- }
-
-
- /*******************************************************************
- GetActualDirID returns that actual directory ID (not the
- parent's) of the folder referenced in the FSSpec * passed.
-
- ********************************************************************/
-
- long GetActualDirID(FSSpec * fSpec)
- {
- DirInfo infoPB;
-
- // Get the passed folder's directory ID.
-
- infoPB.ioNamePtr = fSpec->name;
- infoPB.ioVRefNum = fSpec->vRefNum;
- infoPB.ioDrDirID = fSpec->parID;
- infoPB.ioFDirIndex = 0;
- PBGetCatInfo((CInfoPBPtr) &infoPB,false);
-
- return infoPB.ioDrDirID;
- }
-
-
- /*******************************************************************
- GetDefaultSettings returns our previously saved settings.
-
- ********************************************************************/
-
- OSErr GetDefaultSettings(SpoolCollection *spoolConfig)
- {
- OSErr err;
- long foundDirID;
- short foundVRefNum, oldResRef, resRefNum;
- SpoolCollection **spoolCollHdl = nil;
- FInfo theFInfo;
- FSSpec curFSpec;
- Boolean wasChanged, isNew = false;
- Str255 prefsFileName;
-
- // Try to find our prefs file in the Preferences folder.
-
- err = OpenPrefsFile(&resRefNum, fsRdWrPerm);
- require((err == fnfErr), PrefsFileExists);
-
- // No prefs file-- create and open one.
-
- GetPrefsName((char *) prefsFileName);
- err = FindFolder(kOnSystemDisk,kPreferencesFolderType, kCreateFolder, &foundVRefNum, &foundDirID);
- nrequire(err, FindFolder_Failed1);
-
- HDelete(foundVRefNum, foundDirID, prefsFileName);
- HCreateResFile(foundVRefNum, foundDirID, prefsFileName);
- nrequire((err = ResError()), HCreateResFile_Failed);
-
- HGetFInfo(foundVRefNum, foundDirID, prefsFileName, &theFInfo);
- theFInfo.fdType = kPrefsFileType;
- theFInfo.fdCreator = kPrefsFileCreator;
- HSetFInfo(foundVRefNum, foundDirID, prefsFileName, &theFInfo);
-
- resRefNum = HOpenResFile(foundVRefNum, foundDirID, prefsFileName, fsRdWrPerm);
- nrequire((err = ResError()), HOpenResFile_Failed);
-
-
- PrefsFileExists:
-
- oldResRef = CurResFile();
- UseResFile(resRefNum);
-
-
- // Get a previously saved or newly created alias to the spool folder.
-
- if (gCurFolderAlias != nil)
- DisposHandle((Handle) gCurFolderAlias);
-
- gCurFolderAlias = (AliasHandle) Get1Resource(rAliasType, kAliasID);
-
- if (gCurFolderAlias != nil)
- DetachResource((Handle) gCurFolderAlias);
- else // no resource-- create one.
- {
- err = FindFolder(kOnSystemDisk, kPrintMonitorDocsFolderType, kCreateFolder, &foundVRefNum, &foundDirID);
- nrequire(err, FindFolder_Failed2);
-
- FSMakeFSSpec(foundVRefNum, foundDirID, nil, &curFSpec);
- err = NewAlias(nil, &curFSpec, &gCurFolderAlias);
- nrequire(err, NewAlias_Failed);
-
- err = ReplaceResource((Handle) gCurFolderAlias, rAliasType, kAliasID);
- nrequire(err, ReplaceResource_Failed);
- }
-
-
- // Get a previously saved or newly created handle to our panel settings.
-
- spoolCollHdl = (SpoolCollection **) Get1Resource(kConfigType, kConfigID);
-
- if (spoolCollHdl != nil)
- DetachResource((Handle) spoolCollHdl);
- else // no resource-- create one.
- {
- spoolCollHdl = (SpoolCollection **) NewHandle(sizeof(SpoolCollection));
- (*spoolCollHdl)->extTurnedOn = kRedirectDisabled;
- isNew = true;
- }
-
-
- // If our alias needs to be updated, update it and save off the new volume
- // and folder names. In any case, move our settings into the passed pointer
- // and return them to the caller.
-
- require_action((spoolCollHdl != nil), CanNotCreateSettings, err = MemError(););
-
- HLock((Handle) spoolCollHdl);
- wasChanged = AliasToPathName(gCurFolderAlias, (char *) (*spoolCollHdl)->folderName, (char *) (*spoolCollHdl)->volumeName);
- HUnlock((Handle) spoolCollHdl);
-
- if (wasChanged || isNew)
- err = ReplaceResource((Handle) spoolCollHdl, kConfigType, kConfigID);
-
- BlockMove(*spoolCollHdl, spoolConfig, sizeof(SpoolCollection));
- DisposHandle((Handle) spoolCollHdl);
-
-
- CanNotCreateSettings:
- ReplaceResource_Failed:
- NewAlias_Failed:
- FindFolder_Failed2:
-
- UseResFile(oldResRef);
- CloseResFile(resRefNum);
-
-
- HOpenResFile_Failed:
- HCreateResFile_Failed:
- FindFolder_Failed1:
-
- return err;
- }
-
-
- /*******************************************************************
- OpenPrefsFile opens our preferences file.
-
- ********************************************************************/
-
- OSErr OpenPrefsFile(short *resRefNum, char permission)
- {
- OSErr err;
- long foundDirID;
- short foundVRefNum;
- Boolean targetIsFolder, wasAliased;
- FSSpec fSpec;
- Str255 prefsFileName;
-
-
- // Find the preferences folder and open our preferences file, if it exists.
-
- err = FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder, &foundVRefNum, &foundDirID);
-
- if (!err)
- {
- GetPrefsName((char *) prefsFileName);
- err = FSMakeFSSpec(foundVRefNum, foundDirID, prefsFileName, &fSpec);
- nrequire(err, ThereWasAnError);
-
- err = ResolveAliasFile(&fSpec, true, &targetIsFolder, &wasAliased);
- nrequire(err, ThereWasAnError);
-
- gPrefsVRefNum = fSpec.vRefNum;
- *resRefNum = FSpOpenResFile(&fSpec, permission);
- err = ResError();
- }
-
-
- ThereWasAnError:
-
- return err;
- }
-
-
- /*******************************************************************
- ReplaceResource adds or replaces a resource in the current
- resource file. (Make sure the file you want to access is
- open and is the current resource file!) The resource is
- detached when the data is returned, so call DisposHandle on
- it, NOT ReleaseResource.
-
- ********************************************************************/
-
- OSErr ReplaceResource(Handle newData, OSType resourceType, short resourceID)
- {
- OSErr err;
- Handle oldResource;
-
- oldResource = Get1Resource(resourceType, resourceID);
-
- require((oldResource != nil), AddingNewResource);
- RmveResource(oldResource);
- DisposHandle(oldResource);
-
-
- AddingNewResource:
-
- AddResource(newData, resourceType, resourceID, "\p");
-
- if (!(err = ResError()))
- WriteResource(newData);
-
- UpdateResFile(CurResFile());
- FlushVol(nil, gPrefsVRefNum);
-
- if (!err) DetachResource(newData);
- return err;
- }
-
-
- /*******************************************************************
- GetSpoolCollection is a handy routine that retrieves our
- SpoolCollection item from the current job collection.
-
- ********************************************************************/
-
- OSErr GetSpoolCollection(SpoolCollection *spoolCollect)
- {
- OSErr err;
- Collection jobCollection;
-
- jobCollection = GXGetJobCollection(GXGetJob());
-
- err = GetCollectionItem(jobCollection,
- kSpoolCollectionType,
- gxPrintingTagID,
- nil,
- spoolCollect);
- return err;
- }
-
-
- /*******************************************************************
- AliasToPathName extracts the folder and volume name from the
- passed alias, updating them if it needs to. (I use MatchAlias
- so that I can avoid the user dialogs and volume mounting if
- the alias spans a network.) If these types of aliases are
- out of date, they will be updated at CreateSpoolFile time.
- We return true if the alias has been updated and needs to be
- saved off.
-
- ********************************************************************/
-
- Boolean AliasToPathName(AliasHandle anAlias, char *folderName, char *volName)
- {
- Boolean wasChanged;
- OSErr err;
- FSSpec fSpec;
- short num = 1;
-
- // See if we can find the folder referenced by the alias.
-
- err = MatchAlias(nil, kARMSearch, anAlias, &num, (FSSpecArrayPtr) &fSpec,
- &wasChanged, nil, nil);
-
- nrequire_action(err, AliasMgrError, wasChanged = false;);
-
-
- // If we found the folder but its path has changed, update the folder and
- // volume names referenced.
-
- if (wasChanged)
- err = UpdateAlias(nil, &fSpec, anAlias, &wasChanged);
-
- nrequire(err, AliasMgrError);
- GetAliasInfo(anAlias, asiAliasName, (unsigned char *) folderName);
- GetAliasInfo(anAlias, asiVolumeName, (unsigned char *) volName);
-
-
- AliasMgrError:
-
- return wasChanged;
- }
-
-
- /*******************************************************************
- GetPrefsName returns the name of our preferences file.
-
- ********************************************************************/
-
- void GetPrefsName(char *prefsName)
- {
- short oldResFile;
-
- // We just load the name of our preferences file from our extension.
-
- oldResFile = CurResFile();
- UseResFile(GXGetMessageHandlerResFile());
-
- GetIndString((unsigned char *) prefsName, r_stringRsrc, r_prefsStrIdx);
- UseResFile(oldResFile);
- }
-
-